package com.qfedu.edu.messagecenterserver.mqtt;

import com.alibaba.fastjson2.JSON;
import com.qfedu.edu.bo.QueueMessage;
import com.qfedu.edu.constance.RabbitMQConstance;
import com.qfedu.edu.exception.handler.BusinessException;
import com.qfedu.edu.manager.RabbitMQManager;
import com.qfedu.edu.result.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHandler;

import java.io.UnsupportedEncodingException;

/**
 * 接收Mqtt服务器数据
 */
@Configuration
@Slf4j
public class MqttReceiveHandler {

    @Autowired
    private RabbitMQManager rabbitMQManager;

    /**
     * 此处用于接收 MQTT 发送过来的数据
     * +（加号）：可以（只能）匹配一个单词
     * #（井号）：可以匹配多个单词（或者零个）
     *
     * 这里的硬件每隔5秒钟发一条信息过来....
     * 那么这里实际上是要解决高并发的问题的(写多  读少的情况)
     * 如果是直接去写 Redis的话 那么可能导致Redis崩溃  那么这里需要借助于咋们的
     * RabbitMQ来实现流量的消峰填谷  解决这里存在的并发问题
     *
     * 将并行的请求直接给串行化.... 保证Redis不死....
     *
     * @return MessageHandler
     */
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handlerValue() {
        return message -> {
            //硬件消息
            String hardwareMessage = JSON.toJSONString(message);
            log.info("接受到来自硬件的消息:{}", JSON.toJSONString(message));
            //接下来在这里封装消息
            QueueMessage queueMessage = new QueueMessage();
            queueMessage.setQueueName(RabbitMQConstance.getHardwareMessageQueue());
            //就是设置消息
            queueMessage.setMsg(hardwareMessage);
            //然后发送到队列中去
            try {
                rabbitMQManager.sendToWork(RabbitMQConstance.getHardwareMessageQueue(),JSON.toJSONString(queueMessage));
            } catch (UnsupportedEncodingException e) {
                throw new BusinessException(ResponseCode.SEND_MESSAGE_MQ_EXCEPTION.getCode(),
                        ResponseCode.SEND_MESSAGE_MQ_EXCEPTION.getMsg());
            }
        };
    }
}
